/*
进程间通信工具类
*/

#ifndef IPC_H
#define IPC_H
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <iostream>
#include <cstring>

class IpcServer{
public:
    // 全局单例类
    static IpcServer& getInstance(const std::string &path = ""); // 获取全局单例的方法, 首次调用时需要传入磁盘文件路径
    ~IpcServer(); // 析构函数
    // 禁止拷贝和移动
    IpcServer(const IpcServer&) = delete;
    IpcServer& operator=(const IpcServer&) = delete;
    IpcServer(IpcServer&&) = delete;
    IpcServer& operator=(IpcServer&&) = delete;
    
    int fd = -1; // 服务端门户socket
    int accept_conn(); // 接受连接请求, 调用此函数会阻塞等待连接请求
    int receive_data(int client_fd, size_t expected_size, void* buf); // 接收来自客户端的消息
    int send_data(int client_fd, size_t size, const void* buf); // 向客户端发送消息

private:
    std::string socket_path; // 用于标识进程间通信的文件

    IpcServer(const std::string& path);
    static IpcServer* instance_;
};

class IpcClient{
public:
    // 全局单例类
    static IpcClient& getInstance(const std::string &path = ""); // 获取全局单例的方法, 首次调用时需要传入磁盘文件路径
    ~IpcClient(); // 析构函数
    // 禁止拷贝和移动
    IpcClient(const IpcClient&) = delete;
    IpcClient& operator=(const IpcClient&) = delete;
    IpcClient(IpcClient&&) = delete;
    IpcClient& operator=(IpcClient&&) = delete;
    
    int fd = -1; // 服务端门户socket
    int conn_to_server(); // 接受连接请求, 调用此函数会阻塞等待连接请求
    int receive_data(int client_fd, size_t expected_size, void* buf); // 接收来自客户端的消息
    int send_data(int client_fd, size_t size, const void* buf); // 向客户端发送消息

private:
    std::string socket_path; // 用于标识进程间通信的文件

    IpcClient(const std::string& path);
    static IpcClient* instance_;
};


#endif